#include "MorphologyUtils.h"
using namespace cv;

/**
 * @brief 根据核大小和形状生成结构元素
 *
 * @param kernelSize 核大小（奇数，推荐 3、5、7 等）
 * @param shape 核形状（矩形/椭圆/十字）
 * @return cv::Mat 结构元素
 */
Mat MorphologyUtils::createKernel(int kernelSize, KernelShape shape) {
    int morphShape;
    switch (shape) {
        case RECT:
            morphShape = MORPH_RECT;
            break;
        case ELLIPSE:
            morphShape = MORPH_ELLIPSE;
            break;
        case CROSS:
            morphShape = MORPH_CROSS;
            break;
        default:
            morphShape = MORPH_RECT;
    }
    return getStructuringElement(morphShape, Size(kernelSize, kernelSize));
}

/**
 * @brief 腐蚀操作
 *
 * @param input 输入图像
 * @param kernelSize 核大小
 * @param shape 核形状
 * @return cv::Mat 输出图像
 */
Mat MorphologyUtils::erode(const Mat& input, int kernelSize, KernelShape shape) {
    Mat output;
    Mat kernel = createKernel(kernelSize, shape);
    cv::erode(input, output, kernel);
    return output;
}

/**
 * @brief 膨胀操作
 *
 * @param input 输入图像
 * @param kernelSize 核大小
 * @param shape 核形状
 * @return cv::Mat 输出图像
 */
Mat MorphologyUtils::dilate(const Mat& input, int kernelSize, KernelShape shape) {
    Mat output;
    Mat kernel = createKernel(kernelSize, shape);
    cv::dilate(input, output, kernel);
    return output;
}

/**
 * @brief 开运算（先腐蚀再膨胀）
 *
 * @param input 输入图像
 * @param kernelSize 核大小
 * @param shape 核形状
 * @return cv::Mat 输出图像
 */
Mat MorphologyUtils::open(const Mat& input, int kernelSize, KernelShape shape) {
    Mat output;
    Mat kernel = createKernel(kernelSize, shape);
    morphologyEx(input, output, MORPH_OPEN, kernel);
    return output;
}

/**
 * @brief 闭运算（先膨胀再腐蚀）
 *
 * @param input 输入图像
 * @param kernelSize 核大小
 * @param shape 核形状
 * @return cv::Mat 输出图像
 */
Mat MorphologyUtils::close(const Mat& input, int kernelSize, KernelShape shape) {
    Mat output;
    Mat kernel = createKernel(kernelSize, shape);
    morphologyEx(input, output, MORPH_CLOSE, kernel);
    return output;
}
